<?php
namespace app\common\model;
class Navs extends Base{
	/**
	 * 获取所有的菜单
	 * @param  string  $type  类型 admin | member
	 * @param  array   $where 附加的额外条件
	 * @param  boolean $where 是否获取完整的链接
	 * @return array
	 */
    function getNavs($type,$where=[],$getHref=false){
    	$map=[
    		'type'=>$type
    	];
    	$map=array_merge($map,$where);
    	$list=$this->readAll($map,0,['order'=>'sort,id']);
    	if($getHref){
    		//$domain=request()->domain();
    		$url_html_suffix=config('url_html_suffix');
    		foreach ($list as $k => $v){
    			parse_str($v['params'],$params);
    			$list[$k]['href']=url($v['name'],$params,$url_html_suffix);
    		}
    	}
    	$list=node_merge($list->toArray());
    	return $list;
    }
    /**
     * 通过ID删除菜单以及子集
     * @param  integer $id 菜单ID
     * @return array
     */
    function delById($id){
    	$del=$this->del(['id'=>$id],['pid'=>$id]);
    	if($del){
    		return success();
    	}
    	return error();
    }
    /**
     * 生成导航配置文件(方便引用)
     * @param  string  $type  类型 admin | member
     * @param  boolean  $isChange  是否发生改变
     * @return array
     */
    function exportNavs($type,$isChange=false){
    	$navs=$this->getNavs($type,['status'=>1],true);
    	if(!empty($navs)){
    		$filename=$navs[0]['type'];
    		$path=env('config_path').$filename.'_navs.php';
    		$arrStr="<?php\nreturn ";
    		$arrStr.=var_export($navs,true);
    		$arrStr.=';';
    		$rs=file_put_contents($path,$arrStr);
    		if(false===$rs){
    			return error();
    		}
            if($isChange){
                $this->exportNavsAll();
            }
    		return success();
    	}
    }

    function exportNavsAll(){
        $list=$this->readAll();
        $navs=[];
        foreach($list as $v) {
            $key=strtolower($v['name']);
            if(isset($navs[$key])){
                array_push($navs[$key],[
                    'id'=>$v['id'],
                    'params'=>$v['params'],
                ]);
            }else{
                $navs[$key]=[
                    [
                        'id'=>$v['id'],
                        'params'=>$v['params'],
                    ]
                ];
            }
        }
        $path=env('config_path').'all_navs.php';
        $arrStr="<?php\nreturn ";
        $arrStr.=var_export($navs,true);
        $arrStr.=';';
        $rs=file_put_contents($path,$arrStr);
        if(false===$rs){
            return error();
        }
        return success();
    }
    /**
     * 在控制器中获取当前链接所属的菜单ID
     * @return integer
     */
    function getNavsId(){
        $nav=config('all_navs.'.strtolower(request()->module()).'/'.strtolower(request()->controller()).'/'.strtolower(request()->action()));
        $id=0;
        if(!is_array($nav)){
            $id=0;
        }elseif(count($nav)>1){
            $uri=$_SERVER['REQUEST_URI'];
            foreach ($nav as $k => $v) {
                if(empty($v['params'])){
                    $id=$v['id'];
                }else{
                    $rs=$this->diffPath($uri,$v['params']);
                    if($rs){
                        $id=$v['id'];
                        break;
                    }
                }
            }
        }elseif(isset($nav[0])&&isset($nav[0]['id'])){
            $id=$nav[0]['id'];
        }
        if($id<=0){
            $id=cookie(config('keys.nav_id'));
            $id=$id?$id:0;
        }
        cookie(config('keys.nav_id'),$id);
        return $id;
    }
    /**
     * 匹配当前的参数是否存在于当前链接URI中
     * @param  string $uri    URI地址
     * @param  string $params 参数
     * @return boolean
     */
    private function diffPath($uri,$params){
        $uri.=' '; //勿删
        parse_str($params,$params);
        foreach($params as $k => $v){
          $preg="/({$k}\/{$v}[\.\/\?])|({$k}={$v}[^\w])/";
          if(preg_match($preg,$uri)){
            unset($params[$k]);
          }
        }
        if(empty($params)){
            return true;
        }
        return false;
    }
}
